<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Promise的使用</title>
</head>

<body>

</body>

</html>

<script>
    // 这里需要额外理解事件循环机制的问题

    // // 1.什么是同步和异步，要如何处理异步(原来主要是通过回调函数)。
    // function double(value, callback) {
    //     setTimeout(() => callback(value * 2), 1000)
    // }
    // double(3, (x) => console.log(`I was given: ${x}`))
    // // 2.然后就是 Promise 的具体使用。
    // let p = new Promise(() => { }) // 这里的参数是必传的，若不提供执行器函数，将会报语法错误
    // setTimeout(console.log, 0, p)

    // let p1 = new Promise((resolve, reject) => resolve())
    // console.log('p1:', p1)
    // // setTimeout(console.log, 0, p1)
    // let p2 = new Promise((resolve, reject) => reject())
    // // setTimeout(console.log, 0, p2)
    // console.log('p2:', p2)

    // let q = new Promise((resolve, reject) => setTimeout(resolve, 1000))
    // setTimeout(console.log, 0, q)

    // 4.Promise.resolve()
    // 1>期约的状态只能修改一次，所以这里的超时拒绝逻辑中可以放心设置让期约处于待定状态的最长时间。
    let q1 = new Promise((resolve, reject) => resolve(1, 2, 3))
    q1.then(res => console.log('res:', res))
    let q2 = Promise.resolve()
    // 上面两种情况是等价的
    let q3 = Promise.resolve(4, 5, 6).then(res => console.log('res:', res))
    // 2> 传递性
    // 对于静态方法而言，如果传入的参数本身就是一个期约，那它的行为就类似于一个空的包装(幂等方法)

    // 5.Promise.reject()
    // 没有幂等性，而且用这个抛出的异常无法被 try/catch 捕获

    // 二.期约的实例方法
    // 2.Promise.prototype.then()
    // 两个参数 onResovled,onRejected

</script>